using UnityEngine;
using System.Collections;
using System;

public class DadosIniciais : MonoBehaviour
{

    private static Player_Movement pm;
    private static Portal portalScript;
    private static GameObject key;

    private static Transform player;
    private static Vector3 posicaoPlayer;
    private static Enum_Gravity enumGravity;
    private static Vector3 rotacao;
    private static Vector3 gravity;

    private static GameObject[] platformsBroken;

    void Awake()
    {
        reborn(false);
    }

    void Start()
    {
        player = GameObject.FindGameObjectWithTag(Tags.player).transform;
        pm = player.GetComponent<Player_Movement>();

        GameObject portal = GameObject.FindGameObjectWithTag(Tags.portal);
        portalScript = portal.GetComponent<Portal>();

        key = GameObject.FindGameObjectWithTag(Tags.key);

        platformsBroken = GameObject.FindGameObjectsWithTag(Tags.platform_Broken);

        DadosIniciais.posicaoPlayer = pm.transform.position;
        DadosIniciais.enumGravity = pm.EnumGravity;
        
        primaryGravity();
        DadosIniciais.gravity = Physics.gravity;

        //Pegar cada valor da rotação e colocar no Vector3.
        DadosIniciais.rotacao.x = pm.transform.rotation.x;
        DadosIniciais.rotacao.y = pm.transform.rotation.y;
        DadosIniciais.rotacao.z = pm.transform.rotation.z;

        //Pegar a fase atual do jogo.
        Game_Directory.getInstance().ReachedPhase = portalScript.nextPhase - 2;

        //Salvar o jogo sempre que o usuário entrar em uma fase.
        Game_Save.getInstance().SaveGame();
    }

    public void reborn(bool startCoroutine)
    {
        iTween.CameraFadeAdd();
        iTween.CameraFadeTo(1.4f, 1);
        iTween.CameraFadeFrom(.7f, 1.1f);

        if (startCoroutine)
            StartCoroutine(RebornEnumerator());
    }

    IEnumerator RebornEnumerator()
    {
        //Jogador nao se mover durante um tempo.
        pm.TimeToMove = 0;

        //Caso morra no chao, resetar o 'isGrounded' para que os vetores de movimento do player possam funcionar (ficam Vector3.Zero no chao).
        pm.setIsGrounded(false);

        pm.setPosition(DadosIniciais.posicaoPlayer);
        pm.setRotation(DadosIniciais.rotacao);
        pm.setGravity(Vector3.zero);
        pm.EnumGravity = DadosIniciais.enumGravity;

        Physics.gravity = gravity;

        //Não pode passar de fase.
        portalScript.TookKey = false;

        //Reativar todas as plataformas.
        foreach (GameObject platform in platformsBroken)
        {
            platform.GetComponent<MeshRenderer>().enabled = true;
            platform.GetComponent<BoxCollider>().isTrigger = false;
            platform.GetComponent<Platform_Broken>().RunChronometer = false;
            platform.GetComponent<Platform_Broken>().Chronometer = 0f;
        }

        yield return new WaitForSeconds(.3f);

        //Reativar a chave
        key.SetActive(true);
    }

    /// <summary>
    /// Gravidade inicial do jogo que será mudada dependendo do Enum inicial.
    /// </summary>
    private void primaryGravity()
    {
        switch (DadosIniciais.enumGravity)
        {
            case Enum_Gravity.DOWN:
                Physics.gravity = new Vector3(0f, -9.8f, 0f);
                break;

            case Enum_Gravity.UP:
                Physics.gravity = new Vector3(0f, 9.8f, 0f);
                break;

            case Enum_Gravity.LEFT:
                Physics.gravity = new Vector3(-9.8f, 0f, 0f);
                break;

            case Enum_Gravity.RIGHT:
                Physics.gravity = new Vector3(9.8f, 0f, 0f);
                break;
        }
    }
}
